package com.study.postprocessor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import java.lang.reflect.Proxy;
import java.util.Date;

public class MyBeanPostProcessor implements BeanPostProcessor {

    /**
     *在实例化之后，初始化方法执行之前执行
     * @param bean ：当前被实例化的Bean
     * @param beanName：当前Bean实例在容器中的名称
     * @return 增强后的bean，不能返回null
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor的before方法");
        return bean;
    }

    /**
     * 在初始化方法之后，放入到单例池之前执行
     * @param bean
     * @param beanName
     * @return 增强后的bean，不能返回null
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //System.out.println("BeanPostProcessor的after方法");
        //使用动态代理对目标Bean进行增强，返回proxy对象，进而存储到单例池singletonObjects中
        Object p = Proxy.newProxyInstance(
                bean.getClass().getClassLoader(),
                bean.getClass().getInterfaces(),
                ((proxy, method, args) -> {
                    System.out.println("开始时间：" + (new Date()));
                    Object res = method.invoke(bean, args);
                    System.out.println("结束时间：" + (new Date()));
                    return res;
                }));
        return p;
    }
}
